package com.tedu.element;

import com.tedu.show.GameConstants;

import java.awt.Graphics;
import java.awt.Rectangle;

import javax.swing.ImageIcon;

/**
 * 所有元素的基类
 */
public abstract class ElementObj implements CoordinateConverter {
    // 原始坐标（像素）
    private int x;
    private int y;
    // 网格坐标（格）
    private int gridX;
    private int gridY;
    // 图片长宽
    private int w;
    private int h;
    private ImageIcon icon;
    // 是否存活，true代表生存，false代表死亡
    private boolean live = true;

    public ElementObj() {
    }

    /**
     * @param x     左上角X坐标
     * @param y     左上角Y坐标
     * @param gridX 网格X坐标（列）
     * @param gridY 网格Y坐标（行）
     * @param w     图片宽度
     * @param h     图片高度
     * @param icon  图片
     * @param live  存活状态
     */
    public ElementObj(int x, int y, int gridX, int gridY, int w, int h, ImageIcon icon, boolean live) {
        this.x = x;
        this.y = y;
        this.gridX = gridX;
        this.gridY = gridY;
        this.w = w;
        this.h = h;
        this.icon = icon;
        this.live = live;
    }

    /**
     * @param g 画笔 用于进行绘画
     * @说明 抽象方法，显示元素
     */
    public abstract void showElement(Graphics g);

    /**
     * @说明 移动方法; 需要移动的子类，请重写这个方法
     */
    protected void move() {
    }

    /**
     * @设计模式 模板模式;在模板模式中定义 对象执行方法的先后顺序,由子类选择性重写方法
     */
    public void model(long gameTime) {
        updateImage(gameTime);
        move();
        add(gameTime);
    }

    protected void updateImage(long time) {
    }

    protected void add(long gameTime) {
    }

    public void die() {
    }

    public ElementObj createElement(String str) {
        return null;
    }

    /**
     * @return
     * @说明 本方法返回 元素的碰撞矩形对象
     */
    public Rectangle getRectangle() {
        return new Rectangle(x, y, w, h);
    }

    /**
     * @param obj
     * @return boolean 返回 true 说明有碰撞，返回 false说明没有碰撞
     * @说明 碰撞方法
     */
    public boolean pk(ElementObj obj) {
        return this.getRectangle().intersects(obj.getRectangle());
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
        this.gridX = pixelToGrid(x, GameConstants.TILE_SIZE);
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
        this.gridY = pixelToGrid(y, GameConstants.TILE_SIZE);
    }

    public int getGridX() {
        return gridX;
    }

    public void setGridX(int gridX) {
        this.gridX = gridX;
        this.x = gridToPixel(gridX, GameConstants.TILE_SIZE);
    }

    public int getGridY() {
        return gridY;
    }

    public void setGridY(int gridY) {
        this.gridY = gridY;
        this.y = gridToPixel(gridY, GameConstants.TILE_SIZE);
    }

    public int getW() {
        return w;
    }

    public void setW(int w) {
        this.w = w;
    }

    public int getH() {
        return h;
    }

    public void setH(int h) {
        this.h = h;
    }

    public ImageIcon getIcon() {
        return icon;
    }

    public void setIcon(ImageIcon icon) {
        this.icon = icon;
    }

    public boolean isLive() {
        return live;
    }

    public void setLive(boolean live) {
        this.live = live;
    }
}










